#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <string>
#include <thread>
using namespace std;

// 1.创建新线程，测试观察是否有多条执行流
// 2.测试全局变量，函数，甚至对象，这些能不能被线程共享
//a.
//b.arg是对象的指针
//3.使用线程等待的接口
//4.测试线程ID
//5.C++11线程库

void threadrun()
{
    while(true)
    {
        cout << "I am new thread for C++11" << endl;
        sleep(1);
    }
}
int main()
{
    thread t1(threadrun);
    t1.join();
    return 0;
}



// string to_Hex(pthread_t tid)
// {
//     char buffer[1024] = {0};
//     snprintf(buffer, sizeof(buffer), "%p", tid);
//     return buffer;
// }
// void* routine(void* arg)
// {
//     while(true)
//     {
//         cout << (char*)arg << " "<< to_Hex(pthread_self()) << endl;
//         sleep(1);
//     }
// }
// int main()
// {
//     pthread_t thread;
//     pthread_create(&thread, nullptr, routine, (void*)"thread 1");
//     sleep(3);
//     pthread_join(thread, nullptr);
//     return 0;
// }

// class Request
// {
// public:
//     Request(int start, int end)
//     :_start(start),_end(end)
//     {}

// public:
//     int _start;
//     int _end;
// };

// class Response
// {
// public:
//     Response(int ret = 0, const string& name = "")
//     :_ret(ret),_name(name)
//     {}

// public:
//     int _ret;
//     string _name;//返回结果的时候，知道是哪个线程返回的
// };
// int g_val = 100;
// void show(const string name)
// {
//     cout << name;
// }

// // void *ThreadRoutine(void *arg)
// // {
// //     while (true)
// //     {
// //         // cout << "new thread" << endl;
// //         //show("[new thread]");
// //         cout << (const char*)arg;
// //         printf("pid:%d, g_val:%d, &g_val:%p\n", getpid(), g_val, &g_val);
// //         sleep(1);
// //     }
// // }

// void *SumCount(void *arg)
// {
//     Request* request = (Request*)arg;
//     //int ret = 0;
//     //Response response(0, "thread 1");内存泄漏！！！！！！！！！！
//     Response* response = new Response(0, "thread 1");
//     for(int i = request->_start; i <= request->_end; i++)
//     {
//         // ret += i;
//         response->_ret += i;
//     }

//     // cout << ret << endl;
//     cout << "thread 1 quit ......."  << endl;
//     delete request;
//     return (void*)response;
// }


// int main()
// {
//     pthread_t thread;
//     // pthread_create(&thread, nullptr, ThreadRoutine, (void*)"[new thread]");
//     Request request(1, 100);
//     pthread_create(&thread, nullptr, SumCount, (void*)&request);
//     sleep(1);

//     // Response* res;
//     // pthread_join(thread, (void**)&res);
//     void* res;
//     pthread_join(thread, &res);
//     Response* ret = (Response*)res;
//     cout << "wait success, ret: " << ret->_ret << endl;
//     while (true)
//     {
//         // cout << "I am main thread" << endl;
//         show("[main thread]");
//         printf("pid:%d, g_val:%d, &g_val:%p\n", getpid(), g_val, &g_val);

//         sleep(1);
//     }
//     delete ret;
//     return 0;
// }